/*
 * Copyright (c) 2010-2011 GOV.
 * [Id:User.java  11-8-20 下午4:37 poplar.mumu ]
 */
package org.mumu.pawn.domain;

import org.hibernate.validator.constraints.NotEmpty;
import org.mumu.pawn.fm.annotation.OrderByColumn;
import org.richfaces.component.SortOrder;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.io.Serializable;
import java.util.LinkedHashSet;
import java.util.Set;

/**
 * .
 * <br/>
 *
 * @author poplar.mumu
 * @version 1.0 11-8-20 下午4:37
 * @since JDK 1.5
 */
@Entity
@Table(name = "USR")
public class User implements Serializable {

    private static final long serialVersionUID = 7616928475004823897L;
    /**
     * 主键
     */
    private long id;
    /**
     * 用户名称
     */
    @OrderByColumn
    private String userName;
    /**
     * 用户密码
     */
    private String password;

    /**
     * 用户明文密码，不写入数据库中
     */
    private String plaintextPassword;
    /**
     * 用户性别
     * 0-男性
     * 1-女性
     */
    @OrderByColumn
    private int gender;
    /**
     * 用户昵称
     */
    private String nickName;
    /**
     * 用户出生年月
     */
    @OrderByColumn
    private long birthday;
    /**
     * 用户电子邮件
     */
    private String email;
    /**
     * 用户QQ联系
     */
    private String qq;
    /**
     * 用户联系地址
     */
    private String homeAddress;
    /**
     * 用户家庭号码
     */
    private String homePhone;
    /**
     * 用户手机号码
     */
    private String mobile;
    /**
     * 用户使用状态
     * 0-禁用
     * 1-正常
     * 2-删除
     * 3-
     */
    private int state;
    /**
     * 创建时间
     */
    @OrderByColumn(order = SortOrder.ascending)
    private long createTime;
    /**
     * 创建人
     */
    private long createActor;
    /**
     * 更新时间
     */
    @OrderByColumn
    private long updateTime;
    /**
     * 更新人
     */
    private long updateActor;
    /**
     * 部门信息
     */
    private Set<Department> departments = new LinkedHashSet<Department>();

    /**
     * 角色信息
     */
    private Set<Role> roles = new LinkedHashSet<Role>();

    /**
     * 用户的部门信息，不需要设定级联保存、删除等信息
     *
     * @return 用户的部门信息
     */
    @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.LAZY,
            mappedBy = "users")
    public Set<Department> getDepartments() {
        return departments;
    }

    public void setDepartments(Set<Department> departments) {
        this.departments = departments;
    }

    /**
     * 用户的角色信息
     *
     * @return 用户角色信息
     */
    @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.LAZY,
            mappedBy = "users")
    public Set<Role> getRoles() {
        return roles;
    }

    public void setRoles(Set<Role> roles) {
        this.roles = roles;
    }

    /**
     * @return 主键
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public long getId() {
        return id;
    }

    /**
     * 设置 主键[ID]
     *
     * @param id 主键
     */
    public void setId(long id) {
        this.id = id;
    }

    /**
     * @return 用户名称
     */
    @Column(name = "USERNAME")
    @Size(max = 30, min = 1, message = "用户名称长度在1到30")
    @NotEmpty(message = "用户名称不能为空")
    public String getUserName() {
        return userName;
    }

    /**
     * 设置 用户名称[USERNAME]
     *
     * @param userName 用户名称
     */
    public void setUserName(String userName) {
        this.userName = userName;
    }

    /**
     * @return 用户密码
     */
    @Column(name = "PASSWORD")
    @NotNull
    @NotEmpty
    public String getPassword() {
        return password;
    }

    /**
     * 设置 用户密码[PASSWORD]
     *
     * @param password 用户密码
     */
    public void setPassword(String password) {
        this.password = password;
    }

    /**
     * @return 用户性别
     *         0-男性
     *         1-女性
     */
    @Column(name = "GENDER")
    public int getGender() {
        return gender;
    }

    /**
     * 设置 用户性别
     * 0-男性
     * 1-女性[GENDER]
     *
     * @param gender 用户性别
     *               0-男性
     *               1-女性
     */
    public void setGender(int gender) {
        this.gender = gender;
    }

    /**
     * @return 用户昵称
     */
    @Column(name = "NICKNAME")
    public String getNickName() {
        return nickName;
    }

    /**
     * 设置 用户昵称[NICKTIME]
     *
     * @param nickName 用户昵称
     */
    public void setNickName(String nickName) {
        this.nickName = nickName;
    }

    /**
     * @return 用户出生年月
     */
    @Column(name = "BIRTHDAY")
    public long getBirthday() {
        return birthday;
    }

    /**
     * 设置 用户出生年月[BIRTHDAY]
     *
     * @param birthday 用户出生年月
     */
    public void setBirthday(long birthday) {
        this.birthday = birthday;
    }

    /**
     * @return 用户电子邮件
     */
    @Column(name = "EMAIL")
    public String getEmail() {
        return email;
    }

    /**
     * 设置 用户电子邮件[EMAIL]
     *
     * @param email 用户电子邮件
     */
    public void setEmail(String email) {
        this.email = email;
    }

    /**
     * @return 用户QQ联系
     */
    @Column(name = "QQ")
    public String getQq() {
        return qq;
    }

    /**
     * 设置 用户QQ联系[QQ]
     *
     * @param qq 用户QQ联系
     */
    public void setQq(String qq) {
        this.qq = qq;
    }

    /**
     * @return 用户联系地址
     */
    @Column(name = "HOME_ADDRESS")
    public String getHomeAddress() {
        return homeAddress;
    }

    /**
     * 设置 用户联系地址[HOME_ADDRESS]
     *
     * @param homeAddress 用户联系地址
     */
    public void setHomeAddress(String homeAddress) {
        this.homeAddress = homeAddress;
    }

    /**
     * @return 用户家庭号码
     */
    @Column(name = "HOME_PHONE")
    public String getHomePhone() {
        return homePhone;
    }

    /**
     * 设置 用户家庭号码[HOME_PHONE]
     *
     * @param homePhone 用户家庭号码
     */
    public void setHomePhone(String homePhone) {
        this.homePhone = homePhone;
    }

    /**
     * @return 用户手机号码
     */
    @Column(name = "MOBILE")
    public String getMobile() {
        return mobile;
    }

    /**
     * 设置 用户手机号码[MOBILE]
     *
     * @param mobile 用户手机号码
     */
    public void setMobile(String mobile) {
        this.mobile = mobile;
    }

    /**
     * @return 用户使用状态
     *         0-禁用
     *         1-正常
     *         2-删除
     *         3-
     */
    @Column(name = "STATE")
    public int getState() {
        return state;
    }

    /**
     * 设置 用户使用状态
     * 0-禁用
     * 1-正常
     * 2-删除
     * 3-[STATE]
     *
     * @param state 用户使用状态
     *              0-禁用
     *              1-正常
     *              2-删除
     *              3-
     */
    public void setState(int state) {
        this.state = state;
    }

    /**
     * @return 创建时间
     */
    @Column(name = "CREATE_TIME")
    public long getCreateTime() {
        return createTime;
    }

    /**
     * 设置 创建时间[CREATE_TIME]
     *
     * @param createTime 创建时间
     */
    public void setCreateTime(long createTime) {
        this.createTime = createTime;
    }

    /**
     * @return 创建人
     */
    @Column(name = "CREATE_ACTOR")
    public long getCreateActor() {
        return createActor;
    }

    /**
     * 设置 创建人[CREATE_ACTOR]
     *
     * @param createActor 创建人
     */
    public void setCreateActor(long createActor) {
        this.createActor = createActor;
    }

    /**
     * @return 更新时间
     */
    @Column(name = "UPDATE_TIME")
    public long getUpdateTime() {
        return updateTime;
    }

    /**
     * 设置 更新时间[UPDATE_TIME]
     *
     * @param updateTime 更新时间
     */
    public void setUpdateTime(long updateTime) {
        this.updateTime = updateTime;
    }

    /**
     * @return 更新人
     */
    @Column(name = "UPDATE_ACTOR")
    public long getUpdateActor() {
        return updateActor;
    }

    /**
     * 设置 更新人[UPDATE_ACTOR]
     *
     * @param updateActor 更新人
     */
    public void setUpdateActor(long updateActor) {
        this.updateActor = updateActor;
    }

    /**
     * 取得用户明文密码。
     * 不进行Bean Validation
     * @return 用户明文密码
     */
    @Transient
    public String getPlaintextPassword() {
        return this.plaintextPassword;
    }

    /**
     * 设置用户明文密码。
     *
     * @param plaintextPassword 用户明文密码
     */
    public void setPlaintextPassword(String plaintextPassword) {
        this.plaintextPassword = plaintextPassword;
    }
}
